{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 微调整树参数：subsample 和 colsample_bytree"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "(将步长降为0.05，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style>\n",
       "    .dataframe thead tr:only-child th {\n",
       "        text-align: right;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: left;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>bathrooms</th>\n",
       "      <th>bedrooms</th>\n",
       "      <th>price</th>\n",
       "      <th>price_bathrooms</th>\n",
       "      <th>price_bedrooms</th>\n",
       "      <th>room_diff</th>\n",
       "      <th>room_num</th>\n",
       "      <th>Year</th>\n",
       "      <th>Month</th>\n",
       "      <th>Day</th>\n",
       "      <th>...</th>\n",
       "      <th>walk</th>\n",
       "      <th>walls</th>\n",
       "      <th>war</th>\n",
       "      <th>washer</th>\n",
       "      <th>water</th>\n",
       "      <th>wheelchair</th>\n",
       "      <th>wifi</th>\n",
       "      <th>windows</th>\n",
       "      <th>work</th>\n",
       "      <th>interest_level</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1.5</td>\n",
       "      <td>3</td>\n",
       "      <td>3000</td>\n",
       "      <td>1200.0</td>\n",
       "      <td>750.000000</td>\n",
       "      <td>-1.5</td>\n",
       "      <td>4.5</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>24</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1.0</td>\n",
       "      <td>2</td>\n",
       "      <td>5465</td>\n",
       "      <td>2732.5</td>\n",
       "      <td>1821.666667</td>\n",
       "      <td>-1.0</td>\n",
       "      <td>3.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>6</td>\n",
       "      <td>12</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>2850</td>\n",
       "      <td>1425.0</td>\n",
       "      <td>1425.000000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>17</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1.0</td>\n",
       "      <td>1</td>\n",
       "      <td>3275</td>\n",
       "      <td>1637.5</td>\n",
       "      <td>1637.500000</td>\n",
       "      <td>0.0</td>\n",
       "      <td>2.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>18</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1.0</td>\n",
       "      <td>4</td>\n",
       "      <td>3350</td>\n",
       "      <td>1675.0</td>\n",
       "      <td>670.000000</td>\n",
       "      <td>-3.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>2016</td>\n",
       "      <td>4</td>\n",
       "      <td>28</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 228 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
       "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
       "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
       "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
       "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
       "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
       "\n",
       "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
       "0       4.5  2016      6   24       ...           0      0    0       0   \n",
       "1       3.0  2016      6   12       ...           0      0    0       0   \n",
       "2       2.0  2016      4   17       ...           0      0    0       0   \n",
       "3       2.0  2016      4   18       ...           0      0    0       0   \n",
       "4       5.0  2016      4   28       ...           0      0    1       0   \n",
       "\n",
       "   water  wheelchair  wifi  windows  work  interest_level  \n",
       "0      0           0     0        0     0               1  \n",
       "1      0           0     0        0     0               2  \n",
       "2      0           0     0        0     0               0  \n",
       "3      0           0     0        0     0               2  \n",
       "4      0           0     0        0     0               2  \n",
       "\n",
       "[5 rows x 228 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# path to where the data lies\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath +\"RentListingInquries_FE_train.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 获取特征，标签\n",
    "y = train['interest_level']\n",
    "X = train.drop(['interest_level'], axis=1)\n",
    "\n",
    "# 由于数据集较大，在此随机采样30%的数据构建训练样本，其余作为测试样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.7, stratify=y)\n",
    "X_train = np.array(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# prepare cross validation\n",
    "# 各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "根据前面几步调优得到的最佳参数：n_estimators=124，max_depth=5，min_child_weight=4，其余参数继续默认值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'colsample_bytree': [0.85, 0.9, 0.95], 'subsample': [0.75, 0.8, 0.85]}"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "subsample = [0.75,0.8,0.85]\n",
    "colsample_bytree = [0.85,0.9,0.95]\n",
    "param_test3_2 = dict(subsample=subsample, colsample_bytree=colsample_bytree)\n",
    "param_test3_2\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.60941, std: 0.00325, params: {'colsample_bytree': 0.85, 'subsample': 0.75},\n",
       "  mean: -0.61022, std: 0.00368, params: {'colsample_bytree': 0.85, 'subsample': 0.8},\n",
       "  mean: -0.60964, std: 0.00361, params: {'colsample_bytree': 0.85, 'subsample': 0.85},\n",
       "  mean: -0.61016, std: 0.00486, params: {'colsample_bytree': 0.9, 'subsample': 0.75},\n",
       "  mean: -0.60902, std: 0.00403, params: {'colsample_bytree': 0.9, 'subsample': 0.8},\n",
       "  mean: -0.61082, std: 0.00409, params: {'colsample_bytree': 0.9, 'subsample': 0.85},\n",
       "  mean: -0.61116, std: 0.00404, params: {'colsample_bytree': 0.95, 'subsample': 0.75},\n",
       "  mean: -0.60924, std: 0.00427, params: {'colsample_bytree': 0.95, 'subsample': 0.8},\n",
       "  mean: -0.60930, std: 0.00360, params: {'colsample_bytree': 0.95, 'subsample': 0.85}],\n",
       " {'colsample_bytree': 0.9, 'subsample': 0.8},\n",
       " -0.60901907031949298)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 前面参数调整得到的最优值代入\n",
    "xgb3_2 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=124,  \n",
    "        max_depth=5,\n",
    "        min_child_weight=4,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel = 0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "\n",
    "gsearch3_2 = GridSearchCV(xgb3_2, param_grid = param_test3_2, scoring='neg_log_loss',n_jobs=-1, cv=kfold)\n",
    "gsearch3_2.fit(X_train , y_train)\n",
    "\n",
    "gsearch3_2.grid_scores_, gsearch3_2.best_params_,     gsearch3_2.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([ 31.2503716 ,  32.36522875,  30.8647253 ,  33.30842934,\n",
       "         33.31660433,  33.61966515,  35.24519701,  32.71341066,  29.53133426]),\n",
       " 'mean_score_time': array([ 0.11030517,  0.10959558,  0.1070302 ,  0.11372204,  0.11715765,\n",
       "         0.10881915,  0.11006651,  0.10065742,  0.09499526]),\n",
       " 'mean_test_score': array([-0.60940519, -0.61022191, -0.60963784, -0.6101618 , -0.60901907,\n",
       "        -0.61082447, -0.61115734, -0.60923853, -0.60929941]),\n",
       " 'mean_train_score': array([-0.49037038, -0.49033311, -0.49047835, -0.4875866 , -0.48824103,\n",
       "        -0.48985976, -0.48682442, -0.48659149, -0.48842007]),\n",
       " 'param_colsample_bytree': masked_array(data = [0.85 0.85 0.85 0.9 0.9 0.9 0.95 0.95 0.95],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_subsample': masked_array(data = [0.75 0.8 0.85 0.75 0.8 0.85 0.75 0.8 0.85],\n",
       "              mask = [False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'colsample_bytree': 0.85, 'subsample': 0.75},\n",
       "  {'colsample_bytree': 0.85, 'subsample': 0.8},\n",
       "  {'colsample_bytree': 0.85, 'subsample': 0.85},\n",
       "  {'colsample_bytree': 0.9, 'subsample': 0.75},\n",
       "  {'colsample_bytree': 0.9, 'subsample': 0.8},\n",
       "  {'colsample_bytree': 0.9, 'subsample': 0.85},\n",
       "  {'colsample_bytree': 0.95, 'subsample': 0.75},\n",
       "  {'colsample_bytree': 0.95, 'subsample': 0.8},\n",
       "  {'colsample_bytree': 0.95, 'subsample': 0.85}],\n",
       " 'rank_test_score': array([4, 7, 5, 6, 1, 8, 9, 2, 3], dtype=int32),\n",
       " 'split0_test_score': array([-0.60655785, -0.60598063, -0.60620474, -0.60706505, -0.6040815 ,\n",
       "        -0.60709268, -0.60628515, -0.60402566, -0.60521745]),\n",
       " 'split0_train_score': array([-0.49211777, -0.49261104, -0.49131628, -0.49028616, -0.48921794,\n",
       "        -0.49185805, -0.48704989, -0.48763463, -0.48873958]),\n",
       " 'split1_test_score': array([-0.61553109, -0.61708867, -0.61656857, -0.61963855, -0.61616172,\n",
       "        -0.61852231, -0.61851512, -0.61687664, -0.61570805]),\n",
       " 'split1_train_score': array([-0.48886121, -0.48789139, -0.48710429, -0.48399882, -0.48548912,\n",
       "        -0.48782677, -0.48494754, -0.48593814, -0.48839087]),\n",
       " 'split2_test_score': array([-0.60704227, -0.60964035, -0.60840299, -0.6093    , -0.60945132,\n",
       "        -0.61113025, -0.61142433, -0.60996971, -0.61007287]),\n",
       " 'split2_train_score': array([-0.4887408 , -0.48935911, -0.48979841, -0.4876662 , -0.49049285,\n",
       "        -0.49021646, -0.48535359, -0.48397953, -0.48676958]),\n",
       " 'split3_test_score': array([-0.6097578 , -0.6088503 , -0.60934433, -0.60624878, -0.60670928,\n",
       "        -0.60945498, -0.60975566, -0.60786013, -0.6068017 ]),\n",
       " 'split3_train_score': array([-0.49051318, -0.49039356, -0.49153329, -0.48870111, -0.48815516,\n",
       "        -0.4900907 , -0.48815029, -0.4874816 , -0.48953871]),\n",
       " 'split4_test_score': array([-0.60813554, -0.609548  , -0.60766665, -0.6085526 , -0.60868989,\n",
       "        -0.60791937, -0.60980467, -0.60745864, -0.60869516]),\n",
       " 'split4_train_score': array([-0.49161893, -0.49141043, -0.49263946, -0.48728073, -0.48785008,\n",
       "        -0.48930681, -0.4886208 , -0.48792354, -0.4886616 ]),\n",
       " 'std_fit_time': array([ 0.59252763,  0.47178142,  1.13839608,  0.38892091,  0.27562824,\n",
       "         0.39330099,  1.34987015,  0.39075357,  5.20538044]),\n",
       " 'std_score_time': array([ 0.00420715,  0.00593433,  0.00225696,  0.00872469,  0.01307221,\n",
       "         0.00998886,  0.00974469,  0.00340942,  0.01433601]),\n",
       " 'std_test_score': array([ 0.0032548 ,  0.00368336,  0.00361488,  0.00485943,  0.00402619,\n",
       "         0.00408932,  0.00404391,  0.00426953,  0.00360423]),\n",
       " 'std_train_score': array([ 0.00138317,  0.00162874,  0.00191478,  0.00207373,  0.00165881,\n",
       "         0.00131244,  0.00146436,  0.00147675,  0.00090959])}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch3_2.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.609019 using {'colsample_bytree': 0.9, 'subsample': 0.8}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/Users/karen/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\nE4TEIJh5i10AAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x106cf21d0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch3_2.best_score_, gsearch3_2.best_params_))\n",
    "test_means = gsearch3_2.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch3_2.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch3_2.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch3_2.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch3_2.cv_results_).to_csv('my_preds_subsampleh_colsample_bytree_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(colsample_bytree), len(subsample))\n",
    "train_scores = np.array(train_means).reshape(len(colsample_bytree), len(subsample))\n",
    "\n",
    "for i, value in enumerate(colsample_bytree):\n",
    "    pyplot.plot(subsample, -test_scores[i], label= 'test_colsample_bytree:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'subsample' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'subsample_vs_colsample_bytree1.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "微调之后发现，最佳参数值仍然为： {'colsample_bytree': 0.9, 'subsample': 0.8}"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
